#include <stdio.h>


//在一个整型数组中，只有一个数字出现一次，其他数组都是成对出现的，请找出那个只出现一次的数字。
//
//例如：
//
//数组中有：1 2 3 4 5 1 2 3 4，只有5出现一次，其他数字都出现2次，找出5

//int dog(int arr[],int len){
//    if(len == 0){return -1;}
//    int temp = 0;
//    for(int i = 0;i < len;i++){
//        int num = 0;
//        for(int j = 0;j < len;j++){
//            temp = arr[i];
//            if(temp == arr[j]){
//                num++;
//            }
//        }
//        if(num == 1){
//            return temp;
//        }
//    }
//    return -1;
//}
//
//int main() {
//    int arr[] = {1,2,3,4,5,1,2,3,4};
//
//    printf("%d\n",dog(arr,9));
//    return 0;
//}


//不允许创建临时变量，交换两个整数的内容

//int main(){
//    int a = 10, b = 20;
//    a = a^b;
//    b = a^b;//a^b^b         //b^b=0,0^a=a
//    a = a^b;                //a^b^a
//    printf("a = %d b = %d",a,b);
//    return 0;
//}

//输入一个整数 n ，输出该数32位二进制表示中1的个数。其中负数用补码表示。
//
//数据范围：−231<=n<=231−1−231<=n<=231−1即范围为:−2147483648<=n<=2147483647−2147483648<=n<=2147483647

//int One_1(int n){
//    int sum = 0;
//    for(int i = 0;i < 32;i++){
//        n = n>>i;
//        if((n&1) ==1){
//            sum++;
//        }
//    }
//    return sum;
//}
//
//int One_2(int n){
//    int sum = 0;
//    while (n){
//        sum++;
//        n = n & n-1;
//    }
//    return sum;
//}
//
//int main(){
//    int n;
//    scanf("%d",&n);
//    printf("%d ", One_2(n));
//    return 0;
//}

//获取一个整数二进制序列中所有的偶数位和奇数位，分别打印出二进制序列

//在计算机科学和编程中，掩码（Mask）是一个用于指定某些位保持不变而其它位可以改变的位模式。在进行位运算时，掩码可以用来选取或修改一个数值的特定位。
//
//掩码的主要用途：
//提取特定位：通过与（AND）操作，可以使用掩码从一个数值中提取特定的位。掩码中的1表示对应的位将被保留，而0则表示对应的位会被清零。
//
//设置特定位：通过或（OR）操作，可以将掩码中的某些位设置为1。这里，掩码中的1表示这些位将被设置，而0表示这些位保持不变。
//
//切换特定位：通过异或（XOR）操作，可以用掩码切换特定的位。在这种情况下，掩码中的1表示相应的位将被切换，0表示保持不变。
//
//掩码的具体应用：
//提取偶数位或奇数位：如之前的示例，使用掩码0xAAAAAAAA（二进制中为10101010 10101010 10101010 10101010）和0x55555555（二进制中为01010101 01010101 01010101 01010101），可以分别从一个数值中提取所有偶数位和奇数位。掩码的每个1位表示我们想要保留的那些位。
//例如，如果你有一个数字 0x12345678，你可以通过与操作 0x12345678 & 0xAAAAAAAA 来提取偶数位，结果是只有在0xAAAAAAAA中为1的位置上0x12345678中的位才会被保留。

//void strange_idol( unsigned int n){
//
//    for(int i = 1;i <= 32;i++){
//        if(((n>>i-1) & 1) == 1){
//            printf("%d ",i);
//        }
//    }
//    printf("\n");
//}
//
//int main(){
//    unsigned int n;
//    scanf("%u",&n);
//    unsigned int strange = 0xAAAAAAAA;
//    unsigned int idol = 0x55555555;
//    unsigned int strange_1 = strange & n;
//    unsigned int idol_1 = idol & n;
//    strange_idol(strange_1);
//
//    strange_idol(idol_1);
//    return 0;
//}

//输入两个整数，求两个整数二进制格式有多少个位不同
int different(int n,int m){
    int and = n ^ m;
    int sum = 0;
    while (and){
        and = and & and - 1;
        sum++;
    }
    return sum;
}

int main(){
    int n,m;
    scanf("%d %d",&n,&m);
    printf("%d ", different(n,m));

    return 0;
}